package com.puboot.common.util;

import java.math.BigDecimal;
import java.util.List;

/**
 * 民用航空
 * Created by chen on 2021/12/22.
 */
public class AviationUtil {

    /**
     * 计算 温室气体排放总量，单位为t
     *
     * @param eBurn             燃烧排放量，单位为t
     * @param ePurchaseElectric 购入电力对应的排放量，单位为t
     * @param ePurchaseHeat     购入热力对应的排放量，单位为t
     * @param eOutputElectric   输出电力对应的排放量，单位为t
     * @param eOutputHeat       输出热力对应的排放量，单位为t
     * @return
     */
    public static Double getE(Double eBurn, Double ePurchaseElectric, Double ePurchaseHeat, Double eOutputElectric,
                              Double eOutputHeat) {
        BigDecimal eOutputElectricB = new BigDecimal(eOutputElectric);
        BigDecimal eOutputHeatB = new BigDecimal(eOutputHeat);
        BigDecimal jsgc1 = GasDCUtil.allAdd(eBurn, ePurchaseElectric, ePurchaseHeat);
        BigDecimal jsgc2 = jsgc1.subtract(eOutputElectricB);
        BigDecimal jsgc3 = jsgc2.subtract(eOutputHeatB);
        return jsgc3.doubleValue();
    }

    /**
     * 计算 燃烧排放量，单位为t
     *
     * @param ncvis 第i种燃料的平均低位发热量，对固体和液体燃料以GJ/t为单位，对气体燃料以GJ /104Nm3为单位
     * @param fcis  第i种燃料的净消耗量，对固体和液体燃料以t为单位，对气体燃料以104Nm3为单位
     * @param ccis  第i种燃料的单位热值含碳量，单位为t/GJ
     * @param ofis  第i种燃料的碳氧化率，单位为%
     * @param ncvjs 第j种生物质混合燃料的平均低位发热量，对固体和液体燃料以GJ/t为单位，对气体燃料以GJ /104Nm3为单位
     * @param fcjs  第j种生物质混合燃料的净消耗量，对固体和液体燃料以t为单位，对气体燃料以104Nm3为单位
     * @param bfjs  第j种生物质混合燃料中生物质含量，单位为%
     * @param ccjs  第i种化石燃料的单位热值含碳量，单位为t/GJ
     * @param ofjs  第i种化石燃料的碳氧化率，单位为%
     * @return
     */
    public static Double getEBurn(List<String> ncvis, List<String> fcis, List<String> ccis, List<String> ofis,
                                  List<String> ncvjs, List<String> fcjs, List<String> bfjs, List<String> ccjs,
                                  List<String> ofjs) {
        BigDecimal result = new BigDecimal(0.0);
        BigDecimal cl1B = new BigDecimal(1);
        BigDecimal cl2B = new BigDecimal(12);
        for (int i = 0; i < ncvis.size(); i++) {
            BigDecimal jsgc1 = GasDCUtil.allMul(Double.valueOf(ncvis.get(i)), Double.valueOf(fcis.get(i)),
                    Double.valueOf(ccis.get(i)), Double.valueOf(ofis.get(i)), 44.0);
            result = result.add(jsgc1.divide(cl2B, 10, BigDecimal.ROUND_HALF_UP));
        }
        BigDecimal result1 = new BigDecimal(0.0);
        for (int i = 0; i < ncvjs.size(); i++) {
            BigDecimal bfjB = new BigDecimal(bfjs.get(i));
            BigDecimal jsgc1 = cl1B.subtract(bfjB);
            BigDecimal jsgc2 = GasDCUtil.allMul(Double.valueOf(ncvjs.get(i)), Double.valueOf(fcjs.get(i)),
                    jsgc1.doubleValue(), Double.valueOf(ccjs.get(i)), Double.valueOf(ofjs.get(i)), 44.0);
            result1 = result1.add(jsgc2.divide(cl2B, 10, BigDecimal.ROUND_HALF_UP));
        }
        return result.add(result1).doubleValue();
    }

    /**
     * 计算 购入的电力消费的排放量，单位为t
     *
     * @param adPurchaseElectric 年度内的购入电量，单位为MWh
     * @param efPurchaseElectric 区域电网年平均供电因子，单位为t/MWh
     * @return
     */
    public static Double getEPurchaseElectric(Double adPurchaseElectric, Double efPurchaseElectric) {
        return GasDCUtil.allMul(adPurchaseElectric, efPurchaseElectric).doubleValue();
    }

    /**
     * 计算 购入的热力消费的排放量，单位为t 或者 输出的热力排放量，单位为t
     *
     * @param adPurchaseHeatOrAdOutInputHeat 年度内的外购热力，单位为GJ    年度内的输出热力，单位为GJ
     * @return
     */
    public static Double getEPurchaseHeatOrEOutputHeat(Double adPurchaseHeatOrAdOutInputHeat) {
        return GasDCUtil.allMul(0.11, adPurchaseHeatOrAdOutInputHeat).doubleValue();
    }

    /**
     * 计算 输出的电力排放量，单位为t
     *
     * @param adOutInputElectric 年度内的输出电量，单位为MWh
     * @param efOutInputElectric 区域电网年平均供电因子，单位为t/MWh
     * @return
     */
    public static Double getEOutputElectric(Double adOutInputElectric, Double efOutInputElectric) {
        return GasDCUtil.allMul(adOutInputElectric, efOutInputElectric).doubleValue();
    }
}
